package com.song.study.spring.Config;

import com.song.study.spring.Entity.*;
import com.song.study.spring.Service.PersonService;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;

/**
 * @Author ZhangGuisong
 * @Date 2021/4/24-13:04
 */
@Configuration
@ComponentScan(value = {"com.song.study.spring"},
                excludeFilters = {
                    @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}),
                    @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,classes={PersonService.class})
                })
@Import(value = {Tiger.class,MyImportSelect.class,MyImportDefinitionRegistrar.class} )

/**
 * FilterType.ANNOTATION  注解过滤类型
 * FilterType.ASSIGNABLE_TYPE 按照给定类型
 * FilterType.CUSTOM   自定义过滤类型
 * ASPECTJ, ASPECTJ 表达式类型（很少使用）
 * REGEX  正则表达式类型
 */
public class ApplicationContextConfig {
    /**
     *  @Bean 默认：单例模式,bean 在Ioc容器初始化时，就加载了person 对象，单例模式的饿汉式
     * SCOPE_SINGLETON. 单例模式
     * SCOPE_PROTOTYPE, 多例模式
     * SCOPE_REQUEST,  在一个请求中使用同一个实例
     * SCOPE_SESSION,  在同一个session中使用同一个实例
     * @Scope 默认是单例模式的 singleton  ,
     * prototype:多实例，bean实例是在Ioc容器初始化后，在获取bean 的时候才开始实例化的
     * @Lazy :它使得单例模式的bean对象不再是Ioc容器初始化的时候就将对象实例化，
     * 而是在获取的时候的才实例化bean。单例模式中的懒汉式
     */
    @Bean("person")
    @Lazy
   // @Scope(scopeName = "prototype")
    public Person getPerson(){
        System.out.println("add a object to ioc");
        return new Person("a松",25,"HeZe");
    }
    @Bean
    @Conditional(Dog.class)
    public Dog getDog(){
        return new Dog("小黑");
    }
    @Bean("cat")
    @Conditional(Cat.class)
    public Cat getCat(){
        return new Cat("小花");
    }
    @Bean("personFactoryBean")
    public PersonFactoryBean getPersonFactoryBean(){
        return new PersonFactoryBean();
    }


}
